package store.lunangangster.bpmn.model;

/**
 * EventBasedGateway (事件驱动网关) 并不是基于SequenceFlow上的conditionExpress来计算路由，
 * 而是基于网关之后的事件来选择路由。即与其他网关不同，该网关的路由并不是由单个网关决定，而是由其他事件元素的配置决定的。
 * 当事件驱动网关所配置的一个事件被触发之后，该网关将使用沿着该事件所对应的路径，而剩余路径将变得无效
 * (称之为ExclusiveEventBasedGateway)。
 *
 * <p>如果希望EventBasedGateway能够实例化一个Process，则需要将{@link #instantiate}属性置为<code>true</code>。
 * 为了使其能够实例化Process，请保证EventBasedGateway没有任何incoming SequenceFlow
 *
 * <p>如果EventBasedGateway能够被一组消息中的某一个(one of a set of Message)所触发实例化，但又希望等待所有消息到来
 * 时才进行instantiate操作，除了将{@link #instantiate}置为true以外，还需要将{@link #eventGatewayType}置为"Parallel"。
 *
 * <p>注意：
 * <ul>
 *   <li>事件驱动网关必须有两个以上的输出SequenceFlow</li>
 *   <li>事件驱动网关的输出SequenceFlow不能有conditionExpress属性</li>
 *   <li>位于事件驱动网关的输出SequenceFlow末端的元素对象也是事件驱动网关配置的一部分</li>
 * </ul>
 *
 * <p>事件驱动网关后可出现的元素对象：
 * <ul>
 *   <li>事件驱动网关的输出SequenceFlow后可以使用{@link ReceiveTask}和{@link IntermediateCatchEvent}元素</li>
 *   <li>如果在配置中使用了MessageIntermediateCatchEvent，就不要使用{@link ReceiveTask}，反之亦然</li>
 *   <li>使用在事件驱动网关中的{@link ReceiveTask}不能有任何相关联的{@link IntermediateCatchEvent}</li>
 *   <li>只有如下的{@link IntermediateCatchEvent}才会生效，其余不生效：Message, Signal, Timer, Conditional, and Multiple</li>
 * </ul>
 * @author cwk
 * @version 1.0
 */
public class EventBasedGateway extends Gateway {

  // default false
  protected boolean instantiate;
  // Exclusive or Parallel, default Exclusive
  protected String eventGatewayType;

  public boolean isInstantiate() {
    return instantiate;
  }

  public void setInstantiate(boolean instantiate) {
    this.instantiate = instantiate;
  }

  public String getEventGatewayType() {
    return eventGatewayType;
  }

  public void setEventGatewayType(String eventGatewayType) {
    this.eventGatewayType = eventGatewayType;
  }

  @Override
  public String getModelType() {
    return "EVENT_BASED_GATEWAY";
  }
}
